package org.hydrakyoufeng.dm.admin;

import java.util.List;
import java.util.Map;

import org.hydrakyoufeng.annotation.NotEmpty;
import org.hydrakyoufeng.lang.HKFKeys;
import org.hydrakyoufeng.lang.HKFValues;
import org.hydrakyoufeng.tool.collection.CheckResult;
import org.hydrakyoufeng.tool.collection.MapUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Service;

/**
 * 逻辑处理类，框架中推荐该类的所有方法定义均为：Map<String,Object> methodName(Map<String,Object> param)
 * 其中methodName通过框架的解析，例如请求URL为：admin/{methodName}，Controller会自动根据{methodName}来调用该类中的相同名字的方法。
 * 方法的输入参数Map，是封装过的Map，用于封装客户端在Http中的请求参数，同时将Session和Application也封装进该Map中，
 * 使用session_scope和application_scope可以方便地访问到session和application。
 * 例：session_scope.name等于同操作session域中的name属性（需要搭配MapTool的get或者put等方法使用）。
 * 同SpringMVC一样，方法的输入参数也可以直接加上HttpSession，HttpServletRequest等参数，框架也会直接将这些对象传入进来。
 * 推荐返回为Map<String,Object>类型，这样在处理HTTP请求时，可以方便地传入到request的作用域中。其中url的key表示request的跳转地址，url中使用redirect:开头会完成重定向。
 * 如果是返回json对象，对返回类型无要求，框架会自动将结果转换为json对象。
 * @author HydraKyouFeng
 */
@Service("adminService")
public class AdminService {

	/**
	 * 使用的数据持久层对象
	 */
	@Autowired
	private AdminDao dao;
	
	/**
	 * 查询管理员列表
	 * @param param
	 * @return
	 */
	public Map<String,Object> queryList(Map<String,Object> param) {
		// 设置分页参数
		// MapUtil.pageInit(param, "a.update_time desc");
		Map<String,Object> result;
		try {
			List<?> resultData = dao.queryList(param);
			result = MapUtil.popHashMap(1,HKFValues.MESSAGE_SUCCESS);
			// MapUtil.pageReturn(result, param, dao.queryCount(param));
			result.put(HKFKeys.RESULT_DATA,resultData);
		} catch (Exception e) {
			e.printStackTrace();
			result = MapUtil.popHashMap(HKFValues.STATUS_EXCEPTION_DATABASE,"数据库异常");
		}
		return result;
	}
	
	/**
	 * 管理员登录
	 * @param param
	 * @return
	 */
	@NotEmpty(keys={"tel","password"})
	public Map<String,Object> login(Map<String,Object> param,CheckResult rs) {
		if (rs.getHasErrors()) {
			return MapUtil.popHashMap(HKFValues.STATUS_INVALID_PARAM,rs.toString());
		}
		Map<String,Object> result;
		try {
			Map<String,Object> row = dao.login(param);
			if (null == row) {
				result = MapUtil.popHashMap(HKFValues.STATUS_LOGIN_FAILED,"登录失败");
			} else {
				result = MapUtil.popHashMap(1,HKFValues.MESSAGE_SUCCESS);
				result.put(HKFKeys.RESULT_DATA,row);
			}
		} catch (Exception e) {
			e.printStackTrace();
			result = MapUtil.popHashMap(HKFValues.STATUS_EXCEPTION_DATABASE,"数据库异常");
		}
		return result;
	}
	
	/**
	 * 查看一行管理员的数据
	 * @param param
	 * @return
	 */
	public Map<String,Object> queryRow(Map<String,Object> param) {
		int status = 0;
		String message;
		Object resultData = null;
		try {
			resultData = dao.queryRow(param);
			if (resultData != null) {
				status = 1;
				message = "true";
			} else {
				status = HKFValues.STATUS_FAILED;
				message = "未找到相应数据";
			}
		} catch (Exception e) {
			e.printStackTrace();
			status = HKFValues.STATUS_EXCEPTION_DATABASE;
			message = "数据库异常";
		}
		Map<String,Object> result = MapUtil.popHashMap(status,message);
		if (null != resultData) {
			result.put(HKFKeys.RESULT_DATA,resultData);
		}
		return result;
	}

	/**
	 * 增加管理员数据
	 * 处理客户端的增加请求
	 * @param param
	 * @return
	 */
	public Map<String,Object> insert(Map<String,Object> param) {
		int status = 0;
		String message;
		int effects = 0;
		Map<String,Object> result = MapUtil.popHashMap();
		try {
			effects = dao.insert(param);
			if (effects > 0) {
				status = 1;
				message = "增加成功";
				result.put("t_admin_pk", param.get("t_admin_pk"));
			} else {
				status = HKFValues.STATUS_FAILED;
				message = "增加失败";
			}
		} catch (Exception e) {
			e.printStackTrace();
			if (e instanceof DuplicateKeyException) {
				status = HKFValues.STATUS_DUPLICATE_KEY;
				message = "重复的键";
			} else {
				status = HKFValues.STATUS_EXCEPTION_DATABASE;
				message = "数据库异常";
			}
		}
		result.put(HKFKeys.EFFECTS,effects);
		result.put(HKFKeys.STATUS, status);
		result.put(HKFKeys.MESSAGE, message);
		return result;
	}
	
	/**
	 * 修改管理员数据
	 * 处理客户端提交的修改表单
	 * @param param
	 * @return
	 */
	public Map<String,Object> update(Map<String,Object> param) {
		int status = 0;
		String message;	
		int effects = 0;
		try {
			effects = dao.update(param);
			if (effects > 0) {
				status = 1;
				message = "修改成功";
			} else {
				status = HKFValues.STATUS_FAILED;
				message = "修改失败";
			}
		} catch (Exception e) {
			e.printStackTrace();
			status = HKFValues.STATUS_EXCEPTION_DATABASE;
			message = "数据库异常";
		}
		Map<String,Object> result = MapUtil.popHashMap(status,message);
		result.put(HKFKeys.EFFECTS, effects);
		return result;
	}
	
	/**
	 * 删除管理员数据
	 * @param param 客户端的请求参数
	 * @return 返回结果（详情见类注释）
	 */
	public Map<String,Object> delete(Map<String,Object> param) {
		int status = 0;
		String message;
		int effects = 0;
		try {
			effects = dao.delete(param);
			if (effects > 0) {
				status = 1;
				message = "删除成功";
			} else {
				status = HKFValues.STATUS_FAILED;
				message = "删除失败";
			}
		} catch (Exception e) {
			e.printStackTrace();
			status = HKFValues.STATUS_EXCEPTION_DATABASE;
			message = "数据库异常";
		}
		Map<String,Object> result = MapUtil.popHashMap(status,message);
		result.put(HKFKeys.EFFECTS, effects);
		return result;
	}
}